package ClasesBasicas;

public abstract class Figura {
	protected Tipo tipo;
	protected int fila;
	protected int columna;
	int anchura = 8;
	int altura = 8;

	protected boolean esNegra;

	protected Figura[][] array;
	protected boolean[][] aMovimiento;
	protected int codPieza;
	

	public Tipo getTipo() {

		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public int getFila() {
		return fila;
	}

	public void setFila(int fila) {
		this.fila = fila;
	}

	public int getColumna() {
		return columna;
	}

	public void setColumna(int columna) {
		this.columna = columna;
	}

	public boolean getEsNegro() {
		return esNegra;
	}

	public void setEsNegro(boolean esNegro) {
		this.esNegra = esNegro;
	}

	public Figura[][] getArray() {
		return array;
	}

	public void setArray(Figura[][] array) {
		this.array = array;
	}

	public boolean[][] getaMovimiento() {
		return aMovimiento;
	}

	public void setaMovimiento(boolean[][] aMovimiento) {
		this.aMovimiento = aMovimiento;
	}

	public int getCodPieza() {
		return codPieza;
	}

	public void setCodPieza(int codPieza) {
		this.codPieza = codPieza;
	}
	


	/**
	 * 
	 * @param x
	 * @param y
	 * @param esNegro
	 * @param array
	 * 
	 *            Creo una figura establezco su posicion( x,y) su color y paso
	 *            por parametro el tablero para poder hacer referencia a el
	 *            dentro de la clase
	 * 
	 */
	public Figura(Tipo tipo, int fila, int columna, boolean esNegro,
			Figura[][] array, boolean[][] aMovimiento, int codPieza) {
		this.tipo = tipo;
		this.fila = fila;
		this.columna = columna;
		this.esNegra = esNegro;
		this.array = array;
		this.aMovimiento = aMovimiento;
		array[fila][columna] = this;
		this.codPieza = codPieza;

	}

	public abstract void dondeSePuedeMover();

	public abstract void posiblesMovimientos() throws Exception;

	public void resetearBooleans() {

		for (int i = 0; i < aMovimiento.length; i++) {
			for (int j = 0; j < aMovimiento[i].length; j++) {
				aMovimiento[i][j] = false;

			}
		}
	}

	/**
	 * mover en cruz
	 * 
	 */

	public void recorridoDerecha() {
		
		int i;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si columna+1 se sale del array
		 */
		if (columna + 1 < array.length)
			i = columna + 1;
		else {
			i = columna;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[fila][i] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[fila][i])) {
				aMovimiento[fila][i] = false;
			} 
			i++;
			for (int z = i; z < array.length; z++) {
				aMovimiento[fila][z] = false;

			}
		} else {
			i++;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[fila][i] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[fila][i])) {
						aMovimiento[fila][i] = false;
					}
					i++;
					for (int z = i; z < array.length; z++) {
						aMovimiento[fila][z] = false;

					}
				} else {
					i++;
				}

			}
		} catch (Exception e) {

		}
		
	}

	/**
	 * copiado y modificado de recorridoDerecha
	 * 
	 */

	public void recorridoIzquierda() {
		
		int i;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si columna-1 se sale del array
		 */
		if (columna - 1 >= 0)
			i = columna - 1;
		else {
			i = columna;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[fila][i] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[fila][i])) {
				aMovimiento[fila][i] = false;
			}
			i--;
			for (int z = i; z >= 0; z--) { // z>=0 para que no se salga del
											// array
				aMovimiento[fila][z] = false;

			}
		} else {
			i--;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[fila][i] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[fila][i])) {
						aMovimiento[fila][i] = false;
					}
					i--;
					for (int z = i; z >= 0; z--) { // z>=0 para que no se salga
													// del array
						aMovimiento[fila][z] = false;

					}
				} else {
					i--;
				}

			}
		} catch (Exception e) {

		}
		
	}

	public void recorridoAbajo() {
		
		int i;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila+1 se sale del array
		 */
		if (fila + 1 < array.length)
			i = fila + 1;
		else {
			i = fila;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[i][columna] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][columna])) {
				aMovimiento[i][columna] = false;
			} 
			i++;
			for (int z = i; z < array.length; z++) {
				aMovimiento[z][columna] = false;

			}
		} else {
			i++;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[i][columna] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][columna])) {
						aMovimiento[i][columna] = false;
					} 
					i++;
					for (int z = i; z < array.length; z++) {
						aMovimiento[z][columna] = false;

					}
				} else {
					i++;
				}

			}
		} catch (Exception e) {

		}
		
	}

	public void recorridoArriba() {
	
		int i;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila-1 se sale del array
		 */
		if (fila - 1 >= 0)
			i = fila - 1;
		else {
			i = fila;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[i][columna] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][columna])) {
				aMovimiento[i][columna] = false;
			}
				
			i--;
			for (int z = i; z >= 0; z--) 
				aMovimiento[z][columna] = false;

			
		} else {
			i--;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[i][columna] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][columna])) {
						aMovimiento[i][columna] = false;
					} 
					
					i--;
					for (int z = i; z >= 0; z--) {
						aMovimiento[z][columna] = false;

					}
				} else {
					i--;
				}

			}
		} catch (Exception e) {

		}
		
	}


	/**
	 * mover en diagonal
	 * 
	 * @param piezaActual
	 * @param f
	 * @return
	 */
	
	public void recorridoAbajoDerecha() {
		
		int i;
		int j;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila+1, columna +1 se sale del array
		 */
		if ((fila + 1 < array.length) && (columna + 1 < array.length)) {
			i = fila + 1;
			j = columna + 1;
		}
	
		else {
			i = fila;
			j = columna;
			piezaEnMedio = true;
		}
	
		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[i][j] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][j])) {
				aMovimiento[i][j] = false;
			}
			i++;
			j++;
	
			// Poner a false los que quedan detras de la figura
			while (i < array.length && j < array.length) {
				
				aMovimiento[i][j] = false;
				i++;
				j++;
			}
	
		} else {
			i++;
			j++;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {
	
				if (array[i][j] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][j])) {
						aMovimiento[i][j] = false;
					}
					i++;
					j++;
	
					// Poner a false los que quedan detras de la figura
					while (i >= 0 && j <= array.length) {
						aMovimiento[i][j] = false;
						i++;
						j++;
					}
	
				} else {
					i++;
					j++;
				}
	
			}
		} catch (Exception e) {
	
		}
		
	}

	/**
	 * Copiado y modificado de recorridoAbajoDerecha
	 */
	public void recorridoAbajoIzquierda() {
		
		int i;
		int j;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila+1, columna -1 se sale del array
		 */
		if ((fila + 1 < array.length) && (columna - 1 >= 0)) {
			i = fila + 1;
			j = columna - 1;
		}

		else {
			i = fila;
			j = columna;
			piezaEnMedio = true;
		}

		/**
		 * < Segunda posicion despues de la pieza origen
		 */
		if ((array[i][j] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][j])) {
				aMovimiento[i][j] = false;
			}
			i++;
			j--;

			// Poner a false los que quedan detras de la figura
			while (i <= array.length && j >= 0) {
				try {
					aMovimiento[i][j] = false;
				} catch (Exception e) {

				}
				i++;
				j--;
			}

		} else {
			i++;
			j--;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[i][j] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][j])) {
						aMovimiento[i][j] = false;
					} 
					i++;
					j--;

					// Poner a false los que quedan detras de la figura
					while (i <= array.length && j >= 0) {
						aMovimiento[i][j] = false;
						i++;
						j--;
					}

				} else {
					i++;
					j--;
				}

			}
		} catch (Exception e) {

		}
	
	}

	/**
	 * Copiado y modificado de recorridoAbajoDerecha
	 */
	public void recorridoArribaDerecha() {
		
		int i;
		int j;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila-1, columna +1 se sale del array
		 */
		if ((fila - 1 >= 0) && (columna + 1 < array.length)) {
			i = fila - 1;
			j = columna + 1;
		}

		else {
			i = fila;
			j = columna;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[i][j] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][j])) {
				aMovimiento[i][j] = false;
			}
			i--;
			j++;

			// Poner a false los que quedan detras de la figura
			while (i > 0 && j < array.length) {
				aMovimiento[i][j] = false;
				i--;
				j++;
			}

		} else {
			i--;
			j++;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[i][j] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][j])) {
						aMovimiento[i][j] = false;
					} 
					i--;
					j++;

					// Poner a false los que quedan detras de la figura
					while (i >= 0 && j <= array.length) {
						aMovimiento[i][j] = false;
						i--;
						j++;
					}

				} else {
					i--;
					j++;
				}

			}
		} catch (Exception e) {

		}
		
	}

	/**
	 * Copiado y modificado de recorridoAbajoDerecha
	 */
	public void recorridoArribaIzquierda() {
		
		int i;
		int j;
		boolean piezaEnMedio = false;
		/**
		 * Comprobar si fila-1, columna -1 se sale del array
		 */
		if ((fila - 1 >= 0) && (columna - 1 >= 0)) {
			i = fila - 1;
			j = columna - 1;
		}

		else {
			i = fila;
			j = columna;
			piezaEnMedio = true;
		}

		/**
		 * < Primera posicion despues de la pieza origen
		 */
		if ((array[i][j] != null) && (piezaEnMedio == false)) {
			piezaEnMedio = true;
			if (sonMismoColor(esNegra, array[i][j])) {
				aMovimiento[i][j] = false;
			} 
			i--;
			j--;

			// Poner a false los que quedan detras de la figura
			while (i >= 0 && j >= 0) {
				aMovimiento[i][j] = false;
				i--;
				j--;
			}

		} else {
			i--;
			j--;
		}
		/**
		 * Demas posiciones
		 */
		try {
			while (piezaEnMedio == false) {

				if (array[i][j] != null) {
					piezaEnMedio = true;
					if (sonMismoColor(esNegra, array[i][j])) {
						aMovimiento[i][j] = false;
					} 
					i--;
					j--;
					// Poner a false los que quedan detras de la figura
					while (i >= 0 && j >= 0) {
						aMovimiento[i][j] = false;
						i--;
						j--;
					}

				} else {
					i--;
					j--;
				}

			}
		} catch (Exception e) {

		}
	}

	public boolean sonMismoColor(boolean piezaActual, Figura f) {


		if (piezaActual == f.esNegra) {
			return true;

		} else {
			return false;
		}
	}
	public boolean jaque(){
		return false;
		
	}
	public static void main(String[] args) {

	}

}
